package com.example.exercises;

import java.util.HashMap;

/**
 * 395. 至少有 K 个重复字符的最长子串
 * 给你一个字符串 s 和一个整数 k ，请你找出 s 中的最长子串， 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。
 * <p>
 * 示例 1：
 * <p>
 * 输入：s = "aaabb", k = 3
 * 输出：3
 * 解释：最长子串为 "aaa" ，其中 'a' 重复了 3 次。
 */
public class Solution395 {
    public static void main(String[] args) {
        Solution395 solution = new Solution395();
        String s = "aadaaass";
        solution.longestSubstring(s, 4);
        ThreadLocal threadLocal = new ThreadLocal();
        threadLocal.set(s);
        //threadLocal.set(2);
        System.out.println(threadLocal.get());
    }

    public int longestSubstring(String s, int k) {
        //小于要求长度则直接返回
        if (s.length() < k) {
            return 0;
        }
        //map存储每个字符对应的数量
        HashMap<Character, Integer> counter = new HashMap();
        for (int i = 0; i < s.length(); i++) {
            counter.put(s.charAt(i), counter.getOrDefault(s.charAt(i), 0) + 1);
        }
        //counter.keySet()会将map中的键放到数组中
        for (char c : counter.keySet()) {
            if (counter.get(c) < k) {
                int res = 0;
                //split后会形成一个字符串数组
                //此处将不满足k大小的字符作为分割线，返回一个字符串数组，剩下的即为满足要求的字符，选里面最长的即可。
                for (String t : s.split(String.valueOf(c))) {
                    res = Math.max(res, longestSubstring(t, k));
                }
                return res;
            }
        }
        //如果不存在数量小于k的字符，则返回s的长度。s可通过上面的递归层层更新
        return s.length();
    }
}

class test {


    public static void main(String[] args) {
        test test1 = new test();
        test1.eat("1");
        test1.eat2("2");

    }

    public void eat(Object food) {
        String s = (String) food;
        System.out.println(s);
    }

    public <T extends String> void eat2(T food) {
        String s = food;
        System.out.println(s);
    }
}
